先建立一個 API 專案

建立成功後,專案預設會有一個WeatherForecastController.cs
接著我們先安裝 JWT 套件Microsoft.AspNetCore.Authentication.JwtBearer
建立一個 AuthController 來取得 Token
    [Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        private readonly IConfiguration _configuration;
        public AuthController(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        /// <summary>
        /// 通過賬號+密碼獲取Token
        /// </summary>
        /// <param ></param>
        /// <param ></param>
        /// <returns>Token</returns>
        [AllowAnonymous]
        [HttpGet]
        public IActionResult Get(string userName, string pwd)
        {
            if (!string.IsNullOrEmpty(userName))
            {
                var claims = new[]
                {
                    new Claim(JwtRegisteredClaimNames.Sub, userName),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) // JWT ID
            };
                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
                var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
                var token = new JwtSecurityToken(
                    //頒發者
                    issuer: _configuration["Jwt:Issuer"],
                    //接收者
                    audience: _configuration["Jwt:Audience"],
                    //過期時間(可自行設定,注意和上面的claims內部Exp參數保持一致)
                    expires: DateTime.Now.AddMinutes(15),
                    //簽名證書
                    signingCredentials: creds,
                    //自定義參數
                    claims: claims
                    );
                return Ok(new
                {
                    token = new JwtSecurityTokenHandler().WriteToken(token)
                });
            }
            else
            {
                return BadRequest(new { message = "帳號或密碼失敗" });
            }
        }
    }
Program.cs
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
    o.TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        ValidAudience = builder.Configuration["Jwt:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey
        (Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])),
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = false,
        ValidateIssuerSigningKey = true
    };
});
builder.Services.AddAuthorization();
...
...
...
app.UseAuthentication();
app.UseAuthorization();
appsettings.json
  "Jwt": {
    "Issuer": "https://localhost:444",
    "Audience": "https://localhost:444",
    "Key": "testtest20222022"
  }
我們在預設的 WeatherForecastController Get() 加上 [Authorize],表示在取用這個 API 時要經過授權驗證才能被取用。
打開 Postman 輸入網址會發現 Response 401 Unauthorized,也就是未授權。
利用我們在 AuthController 的 GET 方法來取得,因為是測試所以帳密並沒有經過資料庫驗證,有打就算通過,我們可以看到成功時會回傳給我們 token。
成功取到 token 後我們可以利用這個 token 暢行無阻取用 API XDDD,範例如下
若隨便改 token 中一個字,就會變成 401。
當今 API 被廣泛的使用所以安全性的考量也變得格外重要,透過授權及驗證,可以將 API 更加安全,一般流程都會是在登入的 API 回傳的時候給 token,然後這個 token 就可以在其他 API 要取用時放在 header 裡一起送出,如果沒有 token 或 token驗證失敗會直接回傳 401 並不會進入到 Controller裡面。